#ifndef __BASIC_NETCM_H__
#define __BASIC_NETCM_H__

#include <basic/misc.h>

__BEGIN_DECLS

typedef int SOCKET;
#define INVALID_SOCKET      (SOCKET)(~0)
#define SOCKET_ERROR        (-1)

/*
 * 设置套接字为非阻塞
 */
extern int	/* 0:成功 -1:失败 */
sock_set_nonblock(
        SOCKET sock					/* [IN] 套接字*/
        );

/*
 * 获取套接字信息
 */
struct sock_info
{/*{{{*/
    char self_ip[IP_SIZE+1];
    int self_port;
    char peer_ip[IP_SIZE+1];
    int peer_port;
    int recvbuf_size;
    int sendbuf_size;
};/*}}}*/
extern int  /* 0:成功 -1:失败 */ 
sock_get_info(
        SOCKET sock,                /* [IN] 套接字 */
        struct sock_info *sock_info /* [OUT] 套接字信息 */
        );

/*
 * 根据主机名称或IP获取主机IP
 */
extern char *   /* IP即参数ip NULL:参数错误或不能解析 */
host_name_to_ip(
        char *name,         /* [IN] 主机名称或IP */
        char *ip            /* [OUT] 主机IP */
        );

struct host_addr_info
{/*{{{*/
    char protocol[NAME_SIZE+1];
    char user[NAME_SIZE+1];
    char passwd[FILE_NM_SIZE+1];
    char host[FILE_NM_SIZE+1];
    unsigned int port;
};/*}}}*/

/*
 * 解析主机地址
 */
extern int
host_addr_parse(
        char *addr, /* [IN] 主机地址protocol://user:passwd@host:port */
        struct host_addr_info *info /* [OUT] 解析结果 */
        );

/*
 * 解析主机地址列表
 */
extern int
host_list_parse(
         char *host_list,   /* [IN] 主机地址列表 ready1|ready2,backup */
         struct host_addr_info **pready,    /* [OUT] 在线主机 */
         int *p_ready_num,  /* [OUT] 在线主机数量 */
         struct host_addr_info **pbackup    /* [OUT] 后备主机 */
        );

__END_DECLS

#endif
